<?php

if( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly

if( ! class_exists('ACF_Compatibility') ) :

class ACF_Compatibility {
	
	/**
	*  __construct
	*
	*  Sets up the class functionality.
	*
	*  @date	30/04/2014
	*  @since	5.0.0
	*
	*  @param	void
	*  @return	void
	*/
	function __construct() {
		
		// actions
		add_filter('acf/validate_field',						array($this, 'validate_field'), 20, 1);
		add_filter('acf/validate_field/type=textarea',			array($this, 'validate_textarea_field'), 20, 1);
		add_filter('acf/validate_field/type=relationship',		array($this, 'validate_relationship_field'), 20, 1);
		add_filter('acf/validate_field/type=post_object',		array($this, 'validate_relationship_field'), 20, 1);
		add_filter('acf/validate_field/type=page_link',			array($this, 'validate_relationship_field'), 20, 1);
		add_filter('acf/validate_field/type=image',				array($this, 'validate_image_field'), 20, 1);
		add_filter('acf/validate_field/type=file',				array($this, 'validate_image_field'), 20, 1);
		add_filter('acf/validate_field/type=wysiwyg',			array($this, 'validate_wysiwyg_field'), 20, 1);
		add_filter('acf/validate_field/type=date_picker',		array($this, 'validate_date_picker_field'), 20, 1);
		add_filter('acf/validate_field/type=taxonomy',			array($this, 'validate_taxonomy_field'), 20, 1);
		add_filter('acf/validate_field/type=date_time_picker',	array($this, 'validate_date_time_picker_field'), 20, 1);
		add_filter('acf/validate_field/type=user',				array($this, 'validate_user_field'), 20, 1);
		add_filter('acf/validate_field_group',					array($this, 'validate_field_group'), 20, 1);
		
		// Modify field wrapper attributes
		add_filter('acf/field_wrapper_attributes',				array($this, 'field_wrapper_attributes'), 20, 2);
		
		// location
		add_filter('acf/location/validate_rule/type=post_taxonomy', array($this, 'validate_post_taxonomy_location_rule'), 20, 1);
		add_filter('acf/location/validate_rule/type=post_category', array($this, 'validate_post_taxonomy_location_rule'), 20, 1);
		
		// Update settings
		add_action('acf/init', array($this, 'init'));
	}
	
	/**
	 * init
	 *
	 * Adds compatibility for deprecated settings.
	 *
	 * @date	10/6/19
	 * @since	5.8.1
	 *
	 * @param	void
	 * @return	void
	 */
	function init() {
		
		// Update "show_admin" setting based on defined constant.
		if( defined('ACF_LITE') && ACF_LITE ) {
			acf_update_setting( 'show_admin', false );
		}
	}
	
	/**
	 * field_wrapper_attributes
	 *
	 * Adds compatibility with deprecated field wrap attributes.
	 *
	 * @date	21/1/19
	 * @since	5.7.10
	 *
	 * @param	array $wrapper The wrapper attributes array.
	 * @param	array $field The field array.
	 */
	function field_wrapper_attributes( $wrapper, $field ) {
		
		// Check compatibility setting.
		if( acf_get_compatibility('field_wrapper_class') ) {
			$wrapper['class'] .= " field_type-{$field['type']}";
			if( $field['key'] ) {
				$wrapper['class'] .= " field_key-{$field['key']}";
			}
		}
		
		// Return wrapper.
		return $wrapper;
	}
	
	/**
	*  validate_field
	*
	*  Adds compatibility with deprecated settings
	*
	*  @date	23/04/2014
	*  @since	5.0.0
	*
	*  @param	array $field The field array.
	*  @return	array $field
	*/
	function validate_field( $field ) {
		
		// conditional logic data structure changed to groups in version 5.0.0
		// convert previous data (status, rules, allorany) into groups
		if( isset($field['conditional_logic']['status']) ) {
			
			// check status
			if( $field['conditional_logic']['status'] ) {
				$field['conditional_logic'] = acf_convert_rules_to_groups($field['conditional_logic']['rules'], $field['conditional_logic']['allorany']);
			} else {
				$field['conditional_logic'] = 0;
			}
		}
		
		// return
		return $field;
	}
	
	/**
	*  validate_textarea_field
	*
	*  Adds compatibility with deprecated settings
	*
	*  @date	23/04/2014
	*  @since	5.0.0
	*
	*  @param	array $field The field array.
	*  @return	array $field
	*/
	function validate_textarea_field( $field ) {
		
		// formatting has been removed
		$formatting = acf_extract_var( $field, 'formatting' );
		if( $formatting === 'br' ) {
			$field['new_lines'] = 'br';
		}
		
		// return
		return $field;
	}
	
	/**
	*  validate_relationship_field
	*
	*  Adds compatibility with deprecated settings
	*
	*  @date	23/04/2014
	*  @since	5.0.0
	*
	*  @param	array $field The field array.
	*  @return	array $field
	*/
	function validate_relationship_field( $field ) {
		
		// remove 'all' from post_type
		if( acf_in_array('all', $field['post_type']) ) {
			$field['post_type'] = array();
		}
		
		// remove 'all' from taxonomy
		if( acf_in_array('all', $field['taxonomy']) ) {
			$field['taxonomy'] = array();
		}
		
		// result_elements is now elements
		if( isset($field['result_elements']) ) {
			$field['elements'] = acf_extract_var( $field, 'result_elements' );
		}
		
		// return
		return $field;
	}
	
	/**
	*  validate_image_field
	*
	*  Adds compatibility with deprecated settings
	*
	*  @date	23/04/2014
	*  @since	5.0.0
	*
	*  @param	array $field The field array.
	*  @return	array $field
	*/
	function validate_image_field( $field ) {
		
		// save_format is now return_format
		if( isset($field['save_format']) ) {
			$field['return_format'] = acf_extract_var( $field, 'save_format' );
		}
		
		// object is now array
		if( $field['return_format'] == 'object' ) {
			$field['return_format'] = 'array';
		}
		
		// return
		return $field;
	}
	
	/**
	*  validate_wysiwyg_field
	*
	*  Adds compatibility with deprecated settings
	*
	*  @date	23/04/2014
	*  @since	5.0.0
	*
	*  @param	array $field The field array.
	*  @return	array $field
	*/
	function validate_wysiwyg_field( $field ) {
		
		// media_upload is now numeric
		if( $field['media_upload'] === 'yes' ) {
			$field['media_upload'] = 1;
		} elseif( $field['media_upload'] === 'no' ) {
			$field['media_upload'] = 0;
		}
		
		// return
		return $field;
	}
	
	/**
	*  validate_date_picker_field
	*
	*  Adds compatibility with deprecated settings
	*
	*  @date	23/04/2014
	*  @since	5.0.0
	*
	*  @param	array $field The field array.
	*  @return	array $field
	*/
	function validate_date_picker_field( $field ) {
		
		// date_format has changed to display_format
		if( isset($field['date_format']) ) {
			
			// extract vars
			$date_format = $field['date_format'];
			$display_format = $field['display_format'];
			
			// convert from js to php
			$display_format = acf_convert_date_to_php( $display_format );
			
			// append settings
			$field['display_format'] = $display_format;
			$field['save_format'] = $date_format;
			
			// clean up
			unset($field['date_format']);
		}
		
		// return
		return $field;
	}
	
	/**
	*  validate_taxonomy_field
	*
	*  Adds compatibility with deprecated settings
	*
	*  @date	23/04/2014
	*  @since	5.2.7
	*
	*  @param	array $field The field array.
	*  @return	array $field
	*/
	function validate_taxonomy_field( $field ) {
		
		// load_save_terms deprecated in favour of separate save_terms
		if( isset($field['load_save_terms']) ) {
			$field['save_terms'] = acf_extract_var( $field, 'load_save_terms' );
		}
		
		// return
		return $field;
	}
	
	/**
	*  validate_date_time_picker_field
	*
	*  Adds compatibility with deprecated settings
	*
	*  @date	23/04/2014
	*  @since	5.2.7
	*
	*  @param	array $field The field array.
	*  @return	array $field
	*/
	function validate_date_time_picker_field( $field ) {
		
		// 3rd party date time picker
		// https://github.com/soderlind/acf-field-date-time-picker
		if( !empty($field['time_format']) ) {
			
			// extract vars
			$time_format = acf_extract_var( $field, 'time_format' );
			$date_format = acf_extract_var( $field, 'date_format' );
			$get_as_timestamp = acf_extract_var( $field, 'get_as_timestamp' );
			
			// convert from js to php
			$time_format = acf_convert_time_to_php( $time_format );
			$date_format = acf_convert_date_to_php( $date_format );
			
			// append settings
			$field['return_format'] = $date_format . ' ' . $time_format;
			$field['display_format'] = $date_format . ' ' . $time_format;
			
			// timestamp
			if( $get_as_timestamp === 'true' ) {
				$field['return_format'] = 'U';
			}
		}

		// return
		return $field;
	}
	
	/**
	*  validate_user_field
	*
	*  Adds compatibility with deprecated settings
	*
	*  @date	23/04/2014
	*  @since	5.2.7
	*
	*  @param	array $field The field array.
	*  @return	array $field
	*/
	function validate_user_field( $field ) {
		
		// remove 'all' from roles
		if( acf_in_array('all', $field['role']) ) {
			$field['role'] = '';
		}
		
		// field_type removed in favour of multiple
		if( isset($field['field_type']) ) {
			
			// extract vars
			$field_type = acf_extract_var( $field, 'field_type' );
			
			// multiple
			if( $field_type === 'multi_select' ) {
				$field['multiple'] = true;
			}
		}
		
		// return
		return $field;
	}
	
	/*
	*  validate_field_group
	*
	*  This function will provide compatibility with ACF4 field groups
	*
	*  @type	function
	*  @date	23/04/2014
	*  @since	5.0.0
	*
	*  @param	$field_group (array)
	*  @return	$field_group
	*/
	function validate_field_group( $field_group ) {
		
		// vars
		$version = 5;
		
		// field group key was added in version 5.0.0
		// detect ACF4 data and generate key
		if( !$field_group['key'] ) {
			$version = 4;
			$field_group['key'] = isset($field_group['id']) ? "group_{$field_group['id']}" : uniqid('group_');
		}
		
		// prior to version 5.0.0, settings were saved in an 'options' array
		// extract and merge options into the field group
		if( isset($field_group['options']) ) {
			$options = acf_extract_var($field_group, 'options');
			$field_group = array_merge($field_group, $options);
		}
		
		// location data structure changed to groups in version 4.1.0
		// convert previous data (rules, allorany) into groups
		if( isset($field_group['location']['rules']) ) {
			$field_group['location'] = acf_convert_rules_to_groups($field_group['location']['rules'], $field_group['location']['allorany']);
		}
		
		// some location rule names have changed in version 5.0.0
		// loop over location data and modify rules
		$replace = array(
	 		'taxonomy'		=> 'post_taxonomy',
	 		'ef_media'		=> 'attachment',
	 		'ef_taxonomy'	=> 'taxonomy',
	 		'ef_user'		=> 'user_role',
	 		'user_type'		=> 'current_user_role' // 5.2.0
	 	);
	 	
	 	// only replace 'taxonomy' rule if is an ACF4 field group
	 	if( $version > 4 ) {
		 	unset($replace['taxonomy']);
	 	}
	 	
	 	// loop over location groups
		if( $field_group['location'] ) {
		foreach( $field_group['location'] as $i => $group ) {
			
			// loop over group rules
			if( $group ) {
			foreach( $group as $j => $rule ) {
				
				// migrate param
				if( isset($replace[ $rule['param'] ]) ) {
					$field_group['location'][ $i ][ $j ]['param'] = $replace[ $rule['param'] ];
				}
			}}
		}}
		
		// change layout to style (v5.0.0)
		if( isset($field_group['layout']) ) {
			$field_group['style'] = acf_extract_var($field_group, 'layout');
		}
		
		// change no_box to seamless (v5.0.0)
		if( $field_group['style'] === 'no_box' ) {
			$field_group['style'] = 'seamless';
		}
		
		//return
		return $field_group;
	}
	
	/**
	*  validate_post_taxonomy_location_rule
	*
	*  description
	*
	*  @date	27/8/18
	*  @since	5.7.4
	*
	*  @param	type $var Description. Default.
	*  @return	type Description.
	*/
	function validate_post_taxonomy_location_rule( $rule ) {
		
		// previous versions of ACF (v4.4.12) saved value as term_id
		// convert term_id into "taxonomy:slug" string
		if( is_numeric($rule['value']) ) {
			$term = acf_get_term( $rule['value'] );
			if( $term ) {
				$rule['value'] = acf_encode_term($term);
			}
		}
		
		// return
		return $rule;
	}
	
}

acf_new_instance('ACF_Compatibility');

endif; // class_exists check

/*
 * acf_get_compatibility
 *
 * Returns true if compatibility is enabled for the given component.
 *
 * @date	20/1/15
 * @since	5.1.5
 *
 * @param	string $name The name of the component to check.
 * @return	bool
 */
function acf_get_compatibility( $name ) {
	return apply_filters( "acf/compatibility/{$name}", false );
}